package com.ysp.summary.dataStructure;

import lombok.extern.slf4j.Slf4j;

import java.util.*;

/**
 * 比较一下 有序的map集合
 * 1.   HashMap  无序 不确定的访问
 * 2.   LinkHashMap  继承自HashMap，有访问顺序和插入顺序  默认是按插入顺序排序
 *     通过构造函数 accessOrder=true  可以设置通过按访问顺序访问 先访问的会移到链表尾部  （底层通过双向链表实现）
 * 3.  TreeMap  主要是排序用的，默认是升序  如果要改变排序可以手动重写一个比较器（Comparator）  通过构造函数传入 就可以私人订制排序了
 */
@Slf4j
public class MapDemo {

    /**
     *私人订制的比较器
     */
    static class SelfComparator implements Comparator {

        @Override
        public int compare(Object o1, Object o2) {
            String x = (String) o1;
            String y = (String) o2;
            return -x.compareTo(y);
        }
    }

  public static void main(String[] args) {
//      MapDemo demo =new MapDemo();
      Map<String,Object> hashMap = new HashMap(4);
      hashMap.put("name1",1);
      hashMap.put("name2",2);
      hashMap.put("name3",3);
      Map<String,Object> linkedHashMap = new LinkedHashMap(4,0.75f,false);
      linkedHashMap.put("name1",1);
      linkedHashMap.put("name2",2);
      linkedHashMap.put("name3",3);
      Map<String,Object> linkedHashMap2 = new LinkedHashMap(4,0.75f,true);
      linkedHashMap2.put("name1",1);
      linkedHashMap2.put("name2",2);
      linkedHashMap2.put("name3",3);
      // get访问之后 会放到链表尾部  基于访问顺序 实现
      linkedHashMap2.get("name1");
      Map<String,Object> treeMap = new TreeMap(new SelfComparator());
      treeMap.put("name1",1);
      treeMap.put("name2",2);
      treeMap.put("name3",3);
      log.info("************************乱序输出**************************");
      hashMap.forEach((k,v) -> {
          System.out.println("HashMap  : "+k+","+v);
        });
        log.info("************************有序输出**************************");
      linkedHashMap.forEach((k,v) -> {
          System.out.println("linkedHashMap  : "+k+","+v);
      });
      log.info("***********************访问之后的*有序输出**************************");
      linkedHashMap2.forEach((k,v) -> {
          System.out.println("linkedHashMap2  : "+k+","+v);
      });
      log.info("************************有序输出**************************");
      treeMap.forEach((k,v) -> {
          System.out.println("treeMap  : "+k+","+v);
      });
  }


}
